home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_13_05 / pjp / fiopen.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-04-02  |  1.5 KB  |  38 lines

  1. ------------- Listing 3: The file fiopen.c ------------------
  2.  
  3. // fiopen -- filebuf::open(const char *, ios::openmode)
  4. #include <stdio.h>
  5. #include <fstream>
  6.  
  7. filebuf *filebuf::open(const char *name, ios::openmode mode)
  8.         {       // open a file
  9.         static const char *mods[] = {
  10.                 "r", "w", "a", "rb", "wb", "ab", "r+", "w+", "a+",
  11.                         "r+b", "w+b", "a+b", 0};
  12.         static const int valid[] = {
  13.                 ios::in, ios::out|ios::trunc, ios::out|ios::app,
  14.                 ios::in|ios::binary, ios::out|ios::trunc|ios::binary,
  15.                 ios::out|ios::app|ios::binary, ios::in|ios::out,
  16.                 ios::in|ios::out|ios::trunc, ios::in|ios::out|ios::app,
  17.                 ios::in|ios::out|ios::binary,
  18.                 ios::in|ios::out|ios::trunc|ios::binary,
  19.                 ios::in|ios::out|ios::app|ios::binary, 0};
  20.         FILE *fp;
  21.         int n;
  22.         ios::openmode atefl = mode & ios::ate;
  23.         if (_File != 0)
  24.                 return (0);
  25.         mode &= ~ios::ate;
  26.         for (n = 0; valid[n] != 0 && valid[n] != mode; ++n)
  27.                 ;
  28.         if (valid[n] == 0 || (fp = fopen(name, mods[n])) == 0)
  29.                 return (0);
  30.         if (!atefl || fseek(fp, 0, SEEK_END) == 0)
  31.                 {       // success, initialize and return
  32.                 _Init(fp, 1);
  33.                 return (this);
  34.                 }
  35.         fclose(fp);     // can't position at end
  36.         return (0);
  37.         }
  38.